	var TREE_ID = "modelTree";
	var MODEL_OBJECT_KEY = "yamlObjectKey";
	
	var COMBINACAO_FORM_ID = "combinacaoForm";
	var TEMPLATE_FORM_ID = "templateForm";

	var combinacao = null;
	
	var genericDialog = null;
	
	var gridAssociacoes = null;
	
	/* Events *******************************************************************************/
	/* **************************************************************************************/
	
	function clickButtonRemoverCombinacao(event, element){
		
		if(!combinacao.id){
			Geco.Utils.alert("Combinação ainda não cadastrada.");
			return;
		}	
		
		jQuery.ajax({
			url : "/geco-web/combinacao/remover.do?",
			global : false,
			type : "POST",
			dataType : "json",
			data: {idCombinacao:combinacao.id},
			success : function(responseObject) {
				if(responseObject.taskStatus == "1"){
					window.location = "/geco-web/";
				}else{
					Geco.Utils.alert("Não é possível remover combinação.");
				}	
			}
		});
		
	}
	
	function loadAssociacoes(){
		
		
		if (!combinacao.id) return;
		
		if(!gridAssociacoes){
			
			
			gridAssociacoes = jQuery("#gridAssociacoes");
		
			gridAssociacoes.jqGrid( {
				url : '/geco-web/modelos/buscar/associacoes.do?idCombinacao='+combinacao.id,
				mtype: "POST",
				data: "idCombinacao="+combinacao.id,
				datatype : "json",
				autowidth: true,
				colNames : ['Código', 'Objeto', 'Nível', 'Ordem'],
				colModel : [ {
					name : 'id',
					index : 'id',
					width : 80
				}, {
					name : 'chaveObjetoModelo',
					index : 'chaveObjetoModelo',
					width : 120
				}, {
					name : 'nivel',
					index : 'nivel',
					width : 250
				}, {
					name : 'ordem',
					index : 'ordem',
					width : 80
				}]
			});
			
		} else {
			gridAssociacoes.trigger("reloadGrid");
			
		}	
		
	}
	
	function clickButtonGerarCodigo(){
		
		if(!combinacao.id){
			Geco.Utils.alert("A combinação precisa estar cadastrada.");
			return
		}	
		
		jQuery.ajax({
			url : "/geco-web/modelos/gerar/codigo.do?",
			global : false,
			type : "POST",
			dataType : "json",
			data: {idCombinacao:combinacao.id},
			success : function(responseObject) {
				
				if(responseObject.taskStatus == "1"){
					jQuery("#codePanel").text(responseObject.codigo);
					Geco.Utils.alert("Operação executada com sucesso!");
				}else{
					Geco.Utils.alert("Falha ao gerar código.");
				}	
			}
		});
		
	}
	
	function clickButtonBuscarCombinacaoTemplate(){
		
		
		var tableTemplate = jQuery("<table></table>"); 
		var pagerTemplate = jQuery("<div></div>").attr("id","pager");
		
		var dialogTemplate = jQuery("<div></div>").attr("title","Templates").css("text-align","center");
		dialogTemplate.appendTo(document.body);
		dialogTemplate.append(tableTemplate);
		dialogTemplate.append(pagerTemplate);
		
		// abrir search template
		// abrir Modal
		dialogTemplate.dialog({
			width: 600,
			modal:true,
			close: function(event, ui){
				dialogTemplate.remove();
			}
		});
		
		tableTemplate.jqGrid( {
			mtype: "POST",
			url : '/geco-web/modelos/buscar/template.do?',
			datatype : "json",
			autowidth: true,
			colNames : [ 'Código', 'Descrição', 'Sigla', 'Coleção'],
			colModel : [ {
				name : 'id',
				index : 'id',
				width : 80
			}, {
				name : 'descricao',
				index : 'descricao',
				width : 250,
				search: true,
				stype: "text"
			}, {
				name : 'sigla',
				index : 'sigla',
				width : 80,
				search: true
			}, {
				name : 'colecaoTemplate.descricao',
				index : 'colecaoTemplate.descricao',
				width : 80
			}],
			pager : "#pager",
			rowNum:10,
			viewrecords : true,
			ondblClickRow: function(rowid,iRow,iCol){
				var obj = tableTemplate.getRowData(rowid);
				
				jQuery.ajax({
					url : "/geco-web/modelos/carregar/template.do?",
					global : false,
					type : "POST",
					dataType : "json",
					data: {idTemplate:obj.id},
					success : function(responseObject) {
						if(responseObject.taskStatus == "1"){
							Geco.Utils.populate(TEMPLATE_FORM_ID, {template:responseObject.template});
							dialogTemplate.dialog("close");
						}else{
							Geco.Utils.alert("Falha ao carregar template.");
						}
						
						
					}
				});
				
				
			}
		}); 
		
		tableTemplate.filterToolbar({autoSearch: true});
		
		
		
	}
	
	function clickButtonSalvarCombinacaoTemplate(){
		
		if(!combinacao.id){
			Geco.Utils.alert("Para associar templates ao modelo cadastre antes a combinação.");
			return
		}	
		
		jQuery.ajax({
			url : "/geco-web/modelos/salvar/combinacao/template.do?",
			global : false,
			type : "POST",
			dataType : "json",
			data: jQuery("#"+TEMPLATE_FORM_ID).serialize(),
			success : function(responseObject) {
				
				if(responseObject.taskStatus == "1"){
					Geco.Utils.populate(TEMPLATE_FORM_ID, responseObject.combinacaoTemplate);
					Geco.Utils.alert("Operação executada com sucesso!");
				}else{
					Geco.Utils.alert("Falha ao executar esta operação!");
				}	
			}
		});
		
	}
	
	function clickButtonSalvarCombinacao(){
		
		jQuery.ajax({
			url : "/geco-web/modelos/salvar/combinacao.do?",
			global : false,
			type : "POST",
			dataType : "json",
			data: jQuery("#"+COMBINACAO_FORM_ID).serialize(),
			success : function(responseObject) {
				
				if(responseObject.taskStatus == "1"){
					Geco.Utils.populate(COMBINACAO_FORM_ID, responseObject.combinacao);
					combinacao.id = responseObject.combinacao.id;
					Geco.Utils.alert("Operação executada com sucesso!");
				}else{
					Geco.Utils.alert("Falha ao executar esta operação!");
				}	
			}
		});
		
	}
	
	function clickModelNode(element){	
		
		
		/* Um novo template será carregado, 
		 * certifique-se que o template corrente 
		 * foi salvo caso contrário as alterações serão perdidas. */
		
		/* Informar caminho do objeto do modelo selecionado */
		
		/* Abrir panel de template na aba de fonte */
		
		// carregar dados do objeto selecionado
		
		var chaveObjetoModelo = jQuery(element).attr(MODEL_OBJECT_KEY);
		
		if(!chaveObjetoModelo) return;
		
		if(!combinacao.id){
			Geco.Utils.alert("Para associar templates ao modelo cadastre antes a combinação.");
			return;
		}
		
		// desabilitar e habilitar tela de templates 
		
		var palavras = chaveObjetoModelo.split(".");
		var path = "";
		for(var y = 0; y < palavras.length; y++){
			path += palavras[y] + (y == palavras.length - 1 ? "": " >> ");
		}
		
		jQuery("#headerTemplate").text("Template - " + path);	
		jQuery("#accordion").accordion("activate",1);
		jQuery("#tabs").tabs('select', 0);
		
		var objetoSelecionado = Geco.Utils.getProperty(combinacao.modelo.objectModel, chaveObjetoModelo); 
		
		var attributeDiv = jQuery("#attributeDiv").empty();
		
		var lista = jQuery("<ul></ul>").css("list-style-type","circle");
		
		attributeDiv.append(lista);
		
		for(var property in objetoSelecionado){
			
			if(!isMap(objetoSelecionado[property]) && property != "yamlObjectKey"){
				lista.append("<li>" + property + ": " + objetoSelecionado[property] + "</li>");
			}
			
		}	
		
		if(combinacao.id){
			var key = jQuery(element).attr(MODEL_OBJECT_KEY);
			
			jQuery.ajax({
				url : "/geco-web/modelos/abrir/combinacao/template.do?",
				global : false,
				type : "POST",
				dataType : "json",
				data: {
					"chaveObjetoModelo": jQuery(element).attr(MODEL_OBJECT_KEY),
					"combinacao.id": combinacao.id,
					"combinacao.modelo.id": combinacao.modelo.id
				},
				success : function(responseObject) {
					
					if(responseObject.combinacaoTemplate){
						Geco.Utils.populate(TEMPLATE_FORM_ID,responseObject.combinacaoTemplate);
					}else{
						//Geco.Utils.alert("Este objeto n�o est� associado a nenhum template");
						var combinacaoTemplate = {
								combinacao : {
									id : combinacao.id
								},
								chaveObjetoModelo : chaveObjetoModelo,
								indice: 1
							};
						Geco.Utils.populate(TEMPLATE_FORM_ID, combinacaoTemplate, true);
						
					}
				}
			});	
		}	
	}
	
	/* Ready ********************************************************************************/
	/* **************************************************************************************/
	
	jQuery(document).ready(function(){
		
		var params = getQueryString();
		var parameter = params.idCombinacao ? "idCombinacao="+params.idCombinacao : "idModelo="+params.idModelo;

		jQuery.ajax({
			url : "/geco-web/modelos/abrir/combinacao.do?"+parameter,
			global : false,
			type : "GET",
			dataType : "json",
			success : function(responseObject) {
			
				if(responseObject.taskStatus == "1"){
					combinacao = responseObject.combinacao;
					buildTree("", combinacao.modelo.objectModel, jQuery("#" + TREE_ID));
					Geco.Utils.populate("combinacaoForm",combinacao);
				}else if(responseObject.taskStatus == "3"){
					Geco.Utils.alert("Falha ao carregar modelo.");
				}	
			}
		});
		
		jQuery("#accordion").accordion({
			autoHeight: false,
			change: function(event, ui) {
				if(ui.newHeader.attr("id") == "assoc"){
					loadAssociacoes();
				}	
			}
		});
		
		jQuery("#tabs").tabs();
		
		jQuery("#buttonRemoverCombinacao").click(function(event){
			clickButtonRemoverCombinacao(event,this);
		});
		
		jQuery("#buttonSalvarCombinacao").click(function(event){
			clickButtonSalvarCombinacao(event,this);
		});
		
		jQuery("#buttonSalvarCombinacaoTemplate").click(function(event){
			clickButtonSalvarCombinacaoTemplate(event,this);
		});
		
		jQuery("#buttonBuscarCombinacaoTemplate").click(function(event){
			clickButtonBuscarCombinacaoTemplate(event,this);
		});
		
		jQuery("#buttonGerarCodigo").click(function(event){
			clickButtonGerarCodigo(event,this);
		});

	});

	
	/* Model ********************************************************************************/
	/* **************************************************************************************/
	
	function isMap(object){
		return !(object instanceof String)
			&& !(object instanceof Number)
			&& !(object instanceof Array)
			&& (object instanceof Object);
	}

	function hasChild(object){
		for(var propertyName in object){
			if(isMap(object[propertyName]))
				return true;				
		}
	}	

	function buildTree(key,value,element){
		
		(function(){
			if(isMap(value)){
	
				key = key || "Model";
	
				var node = null;
	
				var li = jQuery("<li></li>");
				
				var span = jQuery("<span></span>").text(key);
				span.attr(MODEL_OBJECT_KEY, value.yamlObjectKey);
				
				element.append(li);
				li.append(span);
				
				if(hasChild(value)){
					var ul = jQuery("<ul></ul>");
					li.append(ul);
					node = ul;
				} else {
					node = element;
				}
				
				
				span.click(function(event){
					clickModelNode(this);
				});
				
				span.css("cursor","pointer");
	
				for(var propertyName in value){
					buildTree(propertyName, value[propertyName], node);
				}
				
			}
		})();	

	}		
	